perm filename EMITE2.SAI[OLD,HE] blob sn#290129 filedate 1977-06-28 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY  COMMENT  INT_TO_FLOAT, COMERR
C00005 00003	!  INITOUT, CLOSEOUT
C00007 00004	!  MAKE_REMARK, EMIT
C00013 ENDMK
C⊗;
ENTRY;  COMMENT  INT_TO_FLOAT, COMERR;
BEGIN "emiter"

REQUIRE "ABBREV.SAI[AL,HE]" SOURCE_FILE;
REQUIRE "EMITER.HDR[AL,HE]" SOURCE_FILE;
    !  That will define all the RELOC and PC constants;

INTERNAL PROCEDURE INT_TO_11FLOAT(REFERENCE INTEGER RES1, RES2; REAL ARG);
    BEGIN "inttf"
    !  ARG is transformed into two integers, NUM1 and NUM2, which
    represent that real in pdp11 floating format;
    INTEGER BYTE;
    REAL T;
    LABEL ST1, ST2;
    INTEGER NUM1, NUM2;
    BYTE←'013200000002;
    T ← ARG;
        START_CODE
                MOVE   2,T;
                JUMPGE 2,ST1;
                MOVN   2,2;
                TLO    2,'400000;
        ST1:    JFCL   2,ST2;
        ST2:    ADDI   2,4;
                DPB    2,BYTE;
                SETZ   1,;
                LSHC   1,16;
                MOVEM  1,NUM1;
                SETZ   1,;
                LSHC   1,16;
                MOVEM  1,NUM2;
        END;
    RES1 ← NUM1;
    RES2 ← NUM2;
    END "inttf";

INTERNAL PROCEDURE COMERR
  (STRING MESSG;RECORD_POINTER(ANY_CLASS) CONTXT (NULL_RECORD));
    !  Non-fatal warnings;
    USERERR(0,1,"HAH!  "&MESSG);
!  INITOUT, CLOSEOUT;

INTEGER REL0;  !  Channel number;
INTEGER REL1;  !  Channel number;
INTEGER REL2;  !  Channel number;
INTEGER REL3;  !  Channel number;

INTERNAL PROCEDURE INITOUT(STRING FNAME,PPN);
    BEGIN "initout" ! Initialize the one output stream, going to the file
    TTEST.DAT;
    INTEGER COUNT, BRCHAR, EOF, FLAG;
    REL1 ← GETCHAN;
    OPEN(REL1,"DSK",0,0,2,COUNT,BRCHAR,EOF);
    ENTER(REL1,"TTEST.DAT",FLAG);
    IF FLAG THEN COMERR("I can't enter TTEST.DAT");
    END "initout";

INTERNAL PROCEDURE CLOSEOUT;
    BEGIN  ! Close all channels;
    CLOSE(REL1);
    END;
!  MAKE_REMARK, EMIT;

STRING RSTRING;

INTERNAL PROCEDURE EMIT(INTEGER PC; REFERENCE INTEGER DATA, RELOC;
    INTEGER LTH (1));
    BEGIN "emit"
    !  Appends to current PAL files.  DATA and RELOC are the first
    words in a block of size LTH.  DATA holds the actual output, and
    RELOC holds relocation information about how to treat the word in
    DATA.  A record is kept of how many bytes have been stored for
    each PC;

    OWN INTEGER ARRAY WORDCOUNT [0:3];  !  How many words have been stored
	for this PC;

    INTEGER J, K, DAT;
    EXTERNAL STRING ARRAY PSOP[1:300];
    FOR J ← 0 STEP 1 UNTIL LTH-1 DO
	BEGIN "emitloop"
	DAT ← MEMORY[LOC(DATA) + J];
	CASE MEMORY[LOC(RELOC) + J] OF
	    BEGIN "case"
            [PSINST]
                ;  !  Removed in this version;
            [SYMDEC]
                ;  !  Removed in this version;
            [SYMREF]
		IF PC = TJFILE
		THEN OUT(REL1,"0" & CRLF);
            [REMARK]
                ;  !  Removed in this version;
            [SKIP]
                ;  !  Removed in this version;
            [CONST]
		IF PC = TJFILE
		THEN OUT(REL1,CVOS(DAT) & CRLF)
	    END "case";
	END "emitloop";
    END "emit";

INTERNAL PROCEDURE MAKE_REMARK(INTEGER PC;STRING REMK);
    BEGIN "make_remark"  !  Outputs this remark to the PAL file;
    RSTRING ← REMK;
    EMIT(PC,0,REMARK);
    END "make_remark";

END "emiter";